#ifndef ETHERNET_HPP_
	#define ETHERNET_HPP_

	#define ETH_HEAD_SIZE		14

	//! Тип протокола
	enum eth_type_e
	{
		ARP	= 0x0806,			//!< Тип протокола ARP
		IP  = 0x0800			//!< Тип протокола IP
	};

	//!	@brief				Установка MAC адреса
	//!	@param 	data		Указатель данные MAC
	//!	@return	err			0
	alt_u8 ethernet_set_mac(alt_u64 mac);

	//!	@brief				Установка IP адреса
	//!	@param 	data		данные IP
	//!	@return	err			0
	alt_u8 ethernet_set_ip(alt_u32 ip);

	//!	@brief				Установка IP адреса
	//!	@param 	ask_buf		Указатель буфер, в котором будет сформироват ответ
	//!	@return	err			0
	alt_u8 ethernet_set_ask_buf(alt_u8* ask_buf);

	//!	@brief				Обработчик входных пакетов
	//!	@param 	frame		Указатель на начало входного пакета (без преамбулы)
	//!	@return	err			0
	alt_u8 ethernet_frame_parser(alt_u8* frame, alt_u16* ask_size);


	//!	@brief				Получить MAC источника последнего проанализированного пакета
	//!	@return	err			MAC
	alt_u64 ethernet_get_smac();

	//!	@brief				Получить MAC назначения последнего проанализированного пакета
	//!	@return	MAC			MAC
	alt_u64 ethernet_get_dmac();

	//!	@brief				Получить тип пакета
	//!	@return	etype		Тип пакета
	alt_u16 ethernet_get_etype();

	//! Структура заголовка Ethernet
	union	eth_header_u
	{
		struct __attribute__((packed, aligned(1)))
		{
			alt_u64		dmac		:48;			//!< Адрес получателя
			alt_u64		smac		:48;			//!< Адрес отправителя
			alt_u16		etype;						//!< Тип протокола
		};
		alt_u8			data[14];
	};

	//! Тип, задающий заголовок ethernet
	typedef union eth_header_u eth_header_t;

#endif /*ETHERNET_HPP_ */
